// 基本定义变量声明函数
let add: (x:number, y:number) => number 

/**
 *  通过interface 定义一个Add 
 *  如果绑定该接口，必须按照定义的类型进行传值，否则报错
 */
interface Add {
  (x: number, y:number):  number
}
// or
type ADD = (x:string, y:string) => string 



let b:ADD = (a,b) => a + b  
console.log(b('1','2')); // '12'

let a:Add = (a,b) => a + b
console.log(a(1,2)); // 3 


/**
 * void 类型 与 any 基本相反  any类型表示 所有类型都行
 *  void 类型表示没有任何类型，当一个函数没有返回值的时候 可以看到返回值类型是 void
 *  声明一个void类型的变量没什么大用, 因为你只能为它赋予 undefined 和 null 
 */

/**
 * 声明一个Lib 类型的对象, 该对象只能包含以下指定属性，并且指定对应的值类型
 */
interface Lib {
  (): void;
  version: string;
  doSomething(): void;
}

// let lib = <Lib>function() {}
// or

let lib: Lib = (() => {}) as Lib
lib.version = '123'
lib.doSomething = () => {}
// lib.num =123 // 类型Lib 上不存在属性num
console.log(lib.version); // 123

function getLib() {
  let lib:Lib = (() => {}) as Lib
  lib.version = '123'
  lib.doSomething = () => {}
}

let lib1 = getLib()





